हम सभी सुप्रसिद्ध VLOOKUP() फ़ंक्शन को जानते हैं जो हमें विभिन्न तालिकाओं से डेटा को संयोजित करने में मदद करता है। हालाँकि, इस फ़ंक्शन में एक महत्वपूर्ण खामी है - यह समान मानों को संयोजित नहीं कर सकता है, अर्थात, यदि शब्द में कोई त्रुटि है, तो कोई मिलान नहीं होगा।
अनुमानित मानों को संयोजित करने में सक्षम होने के लिए, हम अपना स्वयं का फ़ंक्शन बना सकते हैं। चलिए इसे FuzzyLookup() कहते हैं।
आइए कल्पना करें कि हमारे पास दो सूचियाँ हैं। दोनों में लगभग समान तत्व हैं, लेकिन उन्हें थोड़ा अलग तरीके से लिखा जा सकता है। कार्य पहली सूची में प्रत्येक तत्व के लिए दूसरी सूची से सबसे समान तत्व ढूंढना है, अर्थात। निकटतम अधिकतम समान पाठ के लिए खोज लागू करें।
ऐसे में बड़ा सवाल यह है कि "समानता" की कसौटी पर क्या विचार किया जाए। केवल मेल खाने वाले वर्णों की संख्या? क्या लगातार मैचों की संख्या है? क्या कैरेक्टर केस या रिक्त स्थान पर विचार किया जाना चाहिए? किसी वाक्यांश में शब्दों की भिन्न-भिन्न व्यवस्था का क्या करें? कई विकल्प हैं और कोई एक समाधान नहीं है - प्रत्येक स्थिति के लिए कोई न कोई स्थिति दूसरों से बेहतर होगी।
हमारे मामले में, हम सबसे सरल विकल्प लागू करते हैं - वर्ण मिलानों की अधिकतम संख्या के आधार पर खोजें। यह सही नहीं है, लेकिन अधिकांश स्थितियों के लिए यह बहुत अच्छा काम करता है।
जमा करना फ़ंक्शन FuzzyLookup , मेनू खोलें Tools - Macros - Edit Macros... , चुनना Module1 और निम्नलिखित पाठ को मॉड्यूल में कॉपी करें:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String ' moonexcel.com.ua Dim Str As String Dim CellArray As Variant Dim StrArray As Variant If IsMissing(SimThreshold) Then SimThreshold = 0 Str = LCase(LookupValue) StrArray = Split(Str) StrExt = UBound(StrArray) For Each Cell In SrcTable CellArray = Split(LCase(Cell)) CellExt = UBound(CellArray) CellRate = 0 ' हम खोज वाक्यांश में प्रत्येक शब्द की जाँच करते हैं For x = 0 To StrExt StrWord = StrArray(x) If Len(StrWord) = 0 Then GoTo continue_x MaxStrWordRate = 0 ' हम मानों की मूल तालिका से अगले सेल में प्रत्येक शब्द की जांच करते हैं For i = 0 To CellExt CellWord = CellArray(i) If Len(CellWord) = 0 Then GoTo continue_i FindCharNum = OccurrenceNum(StrWord, CellWord) StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord)) If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate continue_i: Next i CellRate = CellRate + MaxStrWordRate continue_x: Next x ' हम सबसे अच्छा मेल रखते हैं If CellRate > MaxCellRate Then MaxCellRate = CellRate BestCell = Cell FindCharNum = OccurrenceNum(Str, Cell) SimRate = FindCharNum / Max(Len(Str),Len(Cell)) End If Next Cell IF SimRate >= SimThreshold Then IF SimThreshold = -1 Then ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")" ElseIf SimThreshold = -2 Then ReturnValue = Format(SimRate, "0.00") Else ReturnValue = BestCell End If Else ReturnValue = "" End If FuzzyLOOKUP = ReturnValue End Function Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String) For i = 1 To Len(SourceString) ' हम प्रत्येक प्रतीक की घटना की तलाश कर रहे हैं Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1) ' हम संयोगों का काउंटर बढ़ाते हैं If Position > 0 Then Count = Count + 1 ' पाए गए प्रतीक को हटा दें TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position) End If Next i OccurrenceNum = Count End Function Function Max(ByVal value1 As Variant, ByVal value2 As Variant) If value1 > value2 Then Result = value1 Else Result = value2 End If Max = Result End Function
अगला, बंद करें Macro Editor और वर्कशीट पर वापस लौटें LibreOffice Calc - अब आप हमारी नई सुविधा का उपयोग कर सकते हैं FuzzyLookup() .
आप भी फीचर का इस्तेमाल कर सकते हैं FUZZYLOOKUP() निःशुल्क एक्सटेंशन इंस्टॉल करके YouLibrecalc.oxt या इसका पूर्ण विशेषताओं वाला संस्करण YLC_Utilities.oxt .
उसके बाद, यह फ़ंक्शन उन सभी फ़ाइलों में उपलब्ध होगा जो LibreOffice Calc में खोली जाएंगी।